$PBExportHeader$uo_tp_dw_filtro_gen.sru
forward
global type uo_tp_dw_filtro_gen from uo_tp_dw_filtro
end type
end forward

global type uo_tp_dw_filtro_gen from uo_tp_dw_filtro
end type
global uo_tp_dw_filtro_gen uo_tp_dw_filtro_gen

type variables
String	is_filtro = 'F'
String	is_valores[]
String	is_col[]
String	is_col_dw[]
String	is_typecol[]
String	is_tabla[]
end variables

forward prototypes
public function string uof_filtro_selec (boolean ab_check)
public function string uof_seleccionados (boolean ab_check)
public function integer uof_col_filtro ()
public function integer uof_col_filtro_dw ()
public function integer uof_typecol_filtro ()
public function integer uof_inicializar ()
public function integer uof_tabla_filtro ()
end prototypes

public function string uof_filtro_selec (boolean ab_check);


STRING ls_selecc, ls_estado
INTEGER li_Fila, li_Control, li_fin

li_Control = 1
li_fin = dw_1.RowCount()

//# Seleccionar los de estado:
IF ab_check &
THEN
	ls_estado = '1'
ELSE
	ls_estado = '0'
END IF

//# Recorrer la dw. e ir colocando las carreras seleccionadas en el Array.
FOR li_fila = 1 TO li_fin
	IF dw_1.uof_GetItem(li_fila,'estado') = ls_estado THEN
		ls_selecc = ls_selecc  + dw_1.uof_GetItem(li_fila,1) + '~t'
	END IF
NEXT

RETURN ls_selecc
end function

public function string uof_seleccionados (boolean ab_check);STRING 	ls_selecc, ls_estado,	ls_col[]
INTEGER 	li_Fila, li_Control, li_fin,	li_col
LONG		ll_i

li_Control = 1
li_fin = dw_1.RowCount()

ls_selecc = ''

//# Seleccionar los de estado:
IF ab_check &
THEN
	ls_estado = '1'
ELSE
	ls_estado = '0'
END IF

//li_col = THIS.uof_col_filtro_dw()

//# Recorrer la dw. e ir colocando las carreras seleccionadas en el Array.
FOR li_fila = 1 TO li_fin
	IF dw_1.uof_GetItem(li_fila,'estado') = ls_estado &
	THEN
	   FOR ll_i = 1 TO UpperBound(is_col_dw)
			IF isNull(dw_1.uof_GetItem(li_fila, is_col_dw[ll_i])) OR TRIM(dw_1.uof_GetItem(li_fila, is_col_dw[ll_i])) = '' THEN
				ls_selecc = ls_selecc  + 'null' + '~t'
			ELSE
				ls_selecc = ls_selecc  + dw_1.uof_GetItem(li_fila,	is_col_dw[ll_i]) + '~t'
			END IF
		NEXT
		IF ls_selecc <> '' THEN
			ls_selecc = ls_selecc + '~n~r'
		END IF
	END IF
NEXT

RETURN ls_selecc
end function

public function integer uof_col_filtro ();/*
	Funcion   	:		uof_col_filtro
	
	Descripcion	:		Asigna a la vble de instancia is_col[] el nombre de las columnas por las que se filtra. 
							
	
	Argumentos	:	   Ninguno
	
	Retorna   	:		Ninguno

*/

Long		ll_cant_col,	ll_col,	ll_col_f
String	ls_col

ll_cant_col = Long(dw_1.Describe("DataWindow.Column.Count"))

ls_col = ''
ll_col_f = 1

FOR ll_col = 1	TO ll_cant_col
	IF (dw_1.Describe("#" + String(ll_col) + ".Tag")) = is_filtro THEN
		ls_col = dw_1.Describe("#" + String(ll_col) + ".Name")
		// Recuperar el nombre en la BD
		ls_col = dw_1.Describe(ls_col + ".DbName")
		// Asignar al array
		is_col[ll_col_f] = ls_col
		// Incrementar subindice
		ll_col_f ++
	END IF
NEXT

RETURN 0
end function

public function integer uof_col_filtro_dw ();/*
	Funcion   	:		uof_col_filtro_dw
	
	Descripcion	:		Asigna a la vble de instancia is_col_dw el nombre de las columnas por la que se filtra. 
							Nombre: el de la col en la dw
							
	
	Argumentos	:	   Ninguno
	
	Retorna   	:		Integer

*/

Long		ll_cant_col,	ll_col,	ll_col_f
String	ls_col

ll_cant_col = Long(dw_1.Describe("DataWindow.Column.Count"))

ls_col = ''
ll_col_f = 1

FOR ll_col = 1	TO ll_cant_col
	IF (dw_1.Describe("#" + String(ll_col) + ".Tag")) = is_filtro THEN
		ls_col = dw_1.Describe("#" + String(ll_col) + ".Name")
		// Recuperar el nombre en la BD
		ls_col = dw_1.Describe(ls_col + ".Name")
		// Asignar al array
		is_col_dw[ll_col_f] = ls_col
		// Incrementar subindice
		ll_col_f ++
	END IF
NEXT

RETURN 0
end function

public function integer uof_typecol_filtro ();/*
	Funcion   	:		uof_typecol_filtro
	
	Descripcion	:		Asigna a la vble de instancia is_typecol[] los tipos de las columnas por las que se filtra. 
							
	Argumentos	:	   Ninguno
	
	Retorna   	:		Integer

*/

Long		ll_cant_col,	ll_col,	ll_col_f
String	ls_col

ll_cant_col = Long(dw_1.Describe("DataWindow.Column.Count"))

ls_col = ''
ll_col_f = 1

FOR ll_col = 1	TO ll_cant_col
	IF (dw_1.Describe("#" + String(ll_col) + ".Tag")) = is_filtro THEN
		ls_col = dw_1.Describe("#" + String(ll_col) + ".Name")
		// Recuperar el tipo en la BD
		ls_col = dw_1.Describe("#" + String(ll_col) + ".ColType")
		// Asignar al array
		is_typecol[ll_col_f] = ls_col
		// Incrementar subindice
		ll_col_f ++
	END IF
NEXT

RETURN 0

end function

public function integer uof_inicializar ();

THIS.uof_col_filtro()
THIS.uof_col_filtro_dw()
THIS.uof_typecol_filtro()
THIS.uof_tabla_filtro()

RETURN 0
end function

public function integer uof_tabla_filtro ();/*
	Funcion   	:		uof_tabla_filtro
	
	Descripcion	:		Retorna el nombre de la tabla, a la que pertenecen las columnas del filtro. 
							Esta tabla esta definida en las Update Properties de la dw.
							Esto es suponiendo que todas las columnas del filtro se seleccionan de la misma tabla
	
	Argumentos	:	   Ninguno
	
	Retorna   	:		String ( nombre de la tabla a la que pertenece la columna del filtro )

*/

Long		ll_i
String	ls_tablacol,	ls_tabla

FOR ll_i = 1 TO UpperBound(is_col[])
	// Extraer el prefijo 'dba.' si existe, extraer el nombre de la tabla
	IF Pos(is_col[ll_i], 'dba.') = 1 THEN
		ls_tablacol = Right(is_col[ll_i], Len(is_col[ll_i]) - 4)
	ELSE
		ls_tablacol = is_col[ll_i]
	END IF
	// Extraer la parte a la izquierda del punto
	ls_tabla = Left(ls_tablacol, Pos(ls_tablacol, '.'))
	// Si no hay punto, se asume como tabla para la columna la actualizable
	IF ls_tabla = '' THEN
		lS_tabla = dw_1.Describe("DataWindow.Table.UpdateTable")
	END IF
		
	is_tabla[ll_i] = ls_tabla

NEXT


RETURN 0		
end function

on uo_tp_dw_filtro_gen.create
call super::create
end on

on uo_tp_dw_filtro_gen.destroy
call super::destroy
end on

event ue_iniciar(string arg_accion, string arg_param[]);call super::ue_iniciar;/* Inicializo valores. Columna de filtro, etc. */
If IsValid(This) Then 	This.uof_inicializar()

end event

type dw_1 from uo_tp_dw_filtro`dw_1 within uo_tp_dw_filtro_gen
end type

type pb_todos from uo_tp_dw_filtro`pb_todos within uo_tp_dw_filtro_gen
end type

type pb_ninguno from uo_tp_dw_filtro`pb_ninguno within uo_tp_dw_filtro_gen
end type

type pb_invertir from uo_tp_dw_filtro`pb_invertir within uo_tp_dw_filtro_gen
end type

